'''la clase Dig es un bit
las Celda esta compuesta por Dig
estas celdas forman los registros de la alu y las celdas de la memoria'''
class Dig ():
    def __init__(self):
        self.__valor=0
		
    def setvalor(self,n):
        self.__valor=n
		
    def getvalor(self):
        return self.__valor
    
    def __add__(self,x):
        resultado= Dig()
        ww=x.getvalor()
        #print "tipo",type(ww)
        res=self.__valor ^ ww
        #print "re"
        resultado.setvalor(res)
        return resultado
    def __str__(self):
        return str(self.__valor)
    
    
class Celda():
    def __init__(self):
        self.__celda= []
        for i in range(8):
            self.__celda.append(Dig())
			
    def getcelda(self):
        return self.__celda
    #carga la celda con el parametro a en decimal
    def setcelda(self,a):
        x=bin(a)
        x=x[2:]
        #x='111'
        aux=len(x)
        #print aux
        #print range(7,7-aux,-1)
        for i in range(7,7-aux,-1):
            
            self.__celda[i].setvalor(int(x[aux-1]))	
            aux-=1
    #carga un bit especificado por el parametro bit con el param x
    def setcel_bin(self,bit,x):
        
        self.__celda[bit].setvalor(x)
    
    def setcel_lis(self,lis):
        self.__celda[:]=lis
    
    def __str__(self):
        b=''
        for i in self.__celda:
            b+=str(i)
        return b

#Memoria
class Memoria():
	
	def __init__(self):
		self.__celdas=[]
		for i in range(17):
			self.__celdas.append(Celda())
	
	def __str__(self):
		b=''
		for i in self.__celdas:
			b+= hex(self.__celdas.index(i)) + '	'+str(i)+'\n'
			
		return b

#ALU

class Alu():
    
    def __init__(self):
        
        self.__reg_a=Celda()
        self.__reg_b=Celda()
        self.__acarr=Dig()
        self.__reg_sal=Celda()
        
    def setreg(self,a,b):
        self.__reg_a.setcelda(a)
        self.__reg_b.setcelda(b)
        
        
    def suma(self):
        
        print "Registro A:  ",self.__reg_a
        print "Registro B:  ",self.__reg_b
        listaa=self.__reg_a.getcelda()
        listab=self.__reg_b.getcelda()
        rang=len(listaa)
        res=[]
        for i in range(rang-1,-1,-1):
                           
            res.insert(0,listaa[i] + listab[i])
            if self.__acarr.getvalor()==1:
                
                if res[0].getvalor()==0:
                    
                    res[0]=res[0]+self.__acarr
                    self.__acarr.setvalor(0)
            if listaa[i].getvalor()&listab[i].getvalor():
                self.__acarr.setvalor(1)    
        
        self.__reg_sal.setcel_lis(res)
        print "Operacion Suma"
        print "Registro de Salida:  ",self.__reg_sal   
            
        
                
            
            
    '''def opand(self):
        
        print "Registro A:  ",self.__reg_a
        print "Registro B:  ",self.__reg_b
        listaa=self.__reg_a.getcelda()
        listab=self.__reg_b.getcelda()
        rang=len(listaa)
        res=[]
        for i in range(rang-1,-1,-1):
            ******Se esta implementando*******
        
    
#diccio={"a":3}	
#diccio[2]=4
#print diccio

d=Celda()
#for i in d:
#    print i
a=Alu()

a.setreg(8,16)
a.suma()
#a.setcelda()
#print'''

